r"""
invoke:格式化提示词模板为PromptValue
format:格式化提示词模板为字符串
partial:格式化提示词模板为一个新的提示词模板，可以继续进行格式化
"""
from langchain_core.prompts import PromptTemplate

# format方法
# 创建一个PromptTemplate对象，用于生成格式化的提示词模板
template1 = PromptTemplate.from_template("你是一个专业的{role}工程师，请回答我的问题给出答案，我的问题是：{question}")
# 使用from方法生成最终的提示词
prompt1 = template1.format(role="数据科学家", question="如何使用LangChain进行文本处理？")
print(prompt1)
print(type(prompt1))    # <class 'str'>

print("=" * 50)
# partial方法
# 创建模板对象，提示词模板
template2 = PromptTemplate.from_template("你是一个专业的{role}工程师，请回答我的问题给出答案，我的问题是：{question}")
# 使用partial方法固定role参数的值
partial = template2.partial(role="数据科学家")
print(partial)
print(type(partial))    # <class 'langchain_core.prompts.prompt.PromptTemplate'>
# 继续使用format方法来填充question参数，生成最终的提示词
prompt2 = partial.format(question="如何使用LangChain进行文本处理？")
print(prompt2)
print(type(prompt2))    # <class 'str'>

print("=" * 50)
# invoke方法
# invoke方法是LangChain Expression Language（LCEL的统一执行入口，用于执行任意可运行对象Runnable），返回的是一个PromptValue对象
# PromptValue对象最终可以用.to_string()或.to_messages()来查看内容

# 创建模板对象，提示词模板
template3 = PromptTemplate.from_template("你是一个专业的{role}工程师，请回答我的问题给出答案，我的问题是：{question}")
prompt3 = template3.invoke({"role":"数据科学家", "question":"如何使用LangChain进行文本处理？"})
print(prompt3)
print(type(prompt3))
print(prompt3.to_string())      # 你是一个专业的数据科学家工程师，请回答我的问题给出答案，我的问题是：如何使用LangChain进行文本处理？
print(prompt3.to_messages())    # [HumanMessage(content='你是一个专业的数据科学家工程师，请回答我的问题给出答案，我的问题是：如何使用LangChain进行文本处理？', additional_kwargs={}, response_metadata={})]